# Warning control
import time
t1=time.perf_counter()
import warnings
warnings.filterwarnings('ignore')
from crewai import Agent, Task, Crew,LLM
import re
llm = LLM(
        model="deepseek/deepseek-chat",
        temperature=0.7,
        base_url="https://api.deepseek.com/v1",
        api_key="key"
)
start_time=time.perf_counter()

# 构思
plan_begin=time.perf_counter()
planner = Agent(
  role='构思者',
  goal='构思以{topic}为用户要求的文章内容创意。',
  backstory='''你是一位文章创意的专家。
  按照{topic}，你需要准备文章的一个详细的大纲,按照文章类型可以适当增添内容到大纲中。
  你需要构思12个主要章节，章节内容要详细，第13章为感悟，章节小标题以一种吸引人的方式命名。
  你的任务是根据用户提供的要求，提供适合读者阅读的、专业的、有见地的文章内容创意。''',
  allow_delegation=False,
  verbose=True,
  llm=llm,
)
plan=Task(
    description='''你的任务是根据用户提供的要求{topic}，提供适合阅读的、专业的、有见地的文章内容创意。
    1.文章结构清晰，富有想象力，具有创新性，主题明确有深度，吸引读者阅读。
      2.文章语言表达与风格同样重要，文笔流畅、具有独特的语言风格以及恰当的修辞。
      3.文章有一定的教育意义，遵守道德和法律准则。
      4.构思的文章章节应为12个和一个感悟章节。
      5.文章鲜明，恰当的修辞和风格、张力与节奏以及有意外与惊喜。
      6.文章能引起读者情感共鸣，注意其在创意、语言描述等方面的协调性。''',
    expected_output='文章内容创意适当分段，并且以Markdown格式输出',
    verbose=True,
    agent=planner,
    llm=llm,
  )
crew_plan=Crew(
      agents=[planner],
      tasks=[plan],
      verbose=True,
      llm=llm,
)
topic=input("用户要求")
plan_result=str(crew_plan.kickoff(inputs={'topic':topic}))
plan_final=time.perf_counter()
plan_time=plan_final-plan_begin

# 写作
write_begin=time.perf_counter()
chapter_number=1
story_content=""
while chapter_number<14:
    writer=Agent(
      role='写作者',
      goal='''根据{plan_result}的大纲内容和章节补充章节内容。''',
      backstory='''你是一位文章章节编写专家，你编写的章节内容有创新性，特别适合用户阅读。
        你的写作基于{plan_result}的大纲内容和章节大概。
        你根据{plan_result}的大纲的内容扩充完不少于800个汉字的第{chapter_number}章节的内容。
        你的任务是完成编写第{chapter_number}个章节内容，前十二个章节每章字数不少于800个汉字。
        第13章字数不少于500字。
        只需要输出第{chapter_number}章节内容chapter_content，不需要输出其他章节。''',
      allow_delegation=False,
      verbose=True,
      llm=llm,
    )
    write=Task(
      description='''你是一位文章章节编写专家，你编写的章节内容有创新性，特别适合阅读。
            1.根据{plan_result}的大纲内容，可以按照需求适当添加细节，扩充不少于800个汉字的第{chapter_number}个章节内容。
            2.第{chapter_number}个章节段落内容不能重复，应有恰当的修辞以让字数不少于800个汉字。
            3.第二章根据{story_content}的第一章章节发展和划分的第二章续写，以此类推，直至第十二章。
            4.第一至十二章不用写感悟。
            5.根据{plan_result}扩充第十三章且字数不少于500字。
            6.每一章节要有标题和标注第几章，第一章最前面要先输出文章标题。
            7.只需要输出第{chapter_number}章节内容chapter_content，不需要输出其他章节。''',
      expected_output='''输出章节标题并且居中显示，章节内容以Markdown形式输出。''',
      agent=writer,
      verbose=True,
      llm=llm,
    )
    crew_write=Crew(
      agents=[writer],
      tasks=[write],
      verbose=True,
      llm=llm,
    )
    chapter_content = str(crew_write.kickoff(inputs={'chapter_number': chapter_number, 'plan_result': plan_result,'story_content':story_content}))
    story_content+=chapter_content + "\n"
    chapter_number=chapter_number + 1

write_final=time.perf_counter()
write_time=write_final-write_begin

# 打分
score_begin=time.perf_counter()
scorer=Agent(
  role='打分者',
  goal='''请根据{story_content}的标题、结构、描写等内容进行打分。''',
  backstory='''你是一位文章打分专家，为了让文章更符合要求，你需要对文章内容进行打分。
      你的任务是根据“1.评估文章的创意(5分)与主题(5分)，考察其创新性(5分)、主题深度(5分)以及明确性(5分)。
      2.深入分析结构构建(10分)，包括逻辑性(10分)、张力与节奏(5分)以及意外与惊喜(5分)。
      3.我们关注文章内容的丰富性(5分)，无明显的错误(10分)以及语言的准确性(5分)。
      4.语言表达与风格同样重要，文笔的流畅性(5分)、独特的语言风格(5分)以及恰当的修辞(5分)。
      5.综合考虑文章的整体印象，评估其在创意、结构、文章风格等方面的协调性(5分)，以及是否能够触动读者的心灵，留下深刻印象(5分)。
      6.计算这次评分最后的总分。
      7.按照标准进行10次评分，计算出的10次评分总分相加的平均值为最后的分数scores例如： 3并在最后一行以数字形式输出”
      标准进行打分，计算出的10次评分的平均值即为最终的分数，例如：3''',
  allow_delegation=False,
  verbose=True,
  llm=llm,
)
score=Task(
  description='''你是一位文章打分专家，为了让文章更符合要求，你需要对文章内容{story_content}进行打分。
      你的任务是根据对{story_content}的文章进行打分。
      1.评估文章的创意(5分)与主题(5分)，考察其创新性(5分)、主题深度(5分)以及明确性(5分)。
      2.深入分析结构构建(10分)，包括逻辑性(10分)、张力与节奏(5分)以及意外与惊喜(5分)。
      3.我们关注文章内容的丰富性(5分)，无明显的错误(10分)以及语言的准确性(5分)。
      4.语言表达与风格同样重要，文笔的流畅性(5分)、独特的语言风格(5分)以及恰当的修辞(5分)。
      5.综合考虑文章的整体印象，评估其在创意、结构、文章风格等方面的协调性(5分)，以及是否能够触动读者的心灵，留下深刻印象(5分)
      6.计算这次评分最后的总分。
      7.按照标准进行10次评分，10次总分相加，求平均值scores例如：3，只需输出scores''',
  expected_output='分数在最后一行以数字形式输出',
  agent=scorer,
  verbose=True,
  llm=llm,
)
crew_score=Crew(
  agents=[scorer],
  tasks=[score],
  verbose=True,
  llm=llm,
)
score_result=str(crew_score.kickoff(inputs={'story_content': story_content}))
score_final=time.perf_counter()
score_time=score_final-score_begin
finally_time=time.perf_counter()

cooperation=round(((plan_time+write_time+score_time)/(finally_time-start_time))*100,2)
cost=round((len(story_content)+len(plan_result)+len(score_result))*2*0.000002,2)
weight = 0.5
resource_weight = 0.1
collaboration_weight = 0.4
sco=score_result[-9:]
match = re.search(r'\d+', sco)
if match:
    score_value = int(match.group())
else:
    print("无法从 score_result 中提取数字")
success_rate=round((score_value * weight + cost * resource_weight + cooperation * collaboration_weight),2)
file = open(r"..\crew\file3.txt", "w", encoding="utf-8")
file.write(story_content)
file.close()
file = open(r"..\crew\score3.txt", "w", encoding="utf-8")
file.write(score_result)
file.close()
print("耗费时间："+str(finally_time-t1))
print("协作效率："+str(cooperation)+"%")
print("花费："+str(cost))
print("综合评分："+str(success_rate)+"%")
file = open(r"..\crew\result3.txt", "w", encoding="utf-8")
file.write("耗费时间："+str(finally_time-t1) +'\n'+ "协作效率："+str(cooperation)+"%" +'\n'+ "花费："+str(cost) +'\n'+ "综合评分："+str(success_rate)+"%")
file.close()